package com.r2coding.system.api;

import com.r2coding.common.to.RegisterEmailTo;
import com.r2coding.common.util.Result;
import com.r2coding.system.entity.PermissionEntity;
import com.r2coding.system.entity.UserEntity;
import com.r2coding.system.feign.ThirdPartyFeignService;
import com.r2coding.system.service.UserService;
import com.r2coding.system.vo.req.AddUserReqVo;
import com.r2coding.system.vo.req.UpdateEmailReqVo;
import com.r2coding.system.vo.req.UpdatePasswordReqVo;
import com.r2coding.system.vo.req.UpdatePhoneReqVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author:98k灬
 * @since:2022/04/09 12:41
 **/
@RestController
@RequestMapping("/api/user")
public class ApiUserController {
    @Autowired
    private UserService userService;

    @Autowired
    ThirdPartyFeignService thirdPartyFeignService;

    /**
     * 根据用户名查询用户信息
     *
     * @param userName 用户名
     * @return 用户信息
     */
    @GetMapping("/getByUserName/{userName}")
    public UserEntity getByUserName(@PathVariable("userName") String userName) {
        return userService.getUserByUserName(userName);
    }

    /**
     * 根据用户id查询该用户拥有的权限信息
     *
     * @param userId 用户id
     * @return 权限信息
     */
    @GetMapping("/getPermissionsByUserId/{userId}")
    public List<PermissionEntity> getPermissionsByUserId(@PathVariable("userId") Integer userId) {
        return userService.getPermissionsByUserId(userId);
    }

    /**
     * 根据用户id查询用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    @GetMapping("/getById/{id}")
    public UserEntity getById(@PathVariable("id") Integer id) {
        return  userService.getById(id);
    }

    /**
     * 注册
     *
     * @param user 用户信息
     * @return 统一响应体
     */
    @PostMapping("/save")
    public Result saveUser(@RequestBody AddUserReqVo user) {
        userService.addUser(user);
        // 用户注册成功，给管理员发送邮件
        sendEmailToAdmin(user.getPhone(), user.getUserName());
        return Result.ok();
    }

    public void sendEmailToAdmin(String phone, String name) {
        RegisterEmailTo email = new RegisterEmailTo(name, phone);
        // Feign + @Async注解进行异步调用 设置子线程可见 解决feign中间的异步调用问题
        // RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);
        thirdPartyFeignService.sendRegisterEmail(email);
    }

    /**
     * 更新邮箱
     *
     * @param req 请求
     * @return 统一响应体
     */
    @PostMapping("/updateEmail")
    public Result updateEmail(@RequestBody UpdateEmailReqVo req) {
        userService.updateEmail(req);
        return Result.ok();
    }

    /**
     * 更新用户手机号
     *
     * @param req 请求
     * @return 统一响应体
     */
    @PostMapping("/updatePhone")
    public Result updatePhone(@RequestBody UpdatePhoneReqVo req) {
        userService.updatePhone(req);
        return Result.ok();
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 统一响应体
     */
    @PostMapping("/update")
    public Result update(@RequestBody UserEntity user) {
        userService.updateUser(user);
        return Result.ok();
    }

    /**
     * 修改密码
     *
     * @param req 请求
     * @return 统一响应体
     */
    @PostMapping("/updatePassword")
    public Result updatePassword(@RequestBody UpdatePasswordReqVo req) {
        userService.updatePassword(req);
        return Result.ok();
    }
}
